# 导入所有的自定义const.py中常量
from .const import *

import os
import sys

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 把当前项目中与项目名同名的小的luffyapi的这个路径加入到环境变量
sys.path.insert(0, BASE_DIR)
# 把apps的路径加入到环境变量。
sys.path.insert(1, os.path.join(BASE_DIR, 'apps'))

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework',
    # cors
    'corsheaders',
    # xadmin
    'xadmin',
    'crispy_forms',
    'reversion',

    # 现在就可以将刚刚的引用注册生效了。
    'user',
    'home',

]
# print(sys.path)

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'lp_2l3b%mnw2_=t4$tks64u!v77*#8%v3(jk8e!c%rlr*bk7@1'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # cors跨域问题: 第三方中间件
    'corsheaders.middleware.CorsMiddleware',
    # cors跨域问题: 自定义简单版本中间件
    # 'utils.middle.CorsMiddleware',
]

# cors跨域问题: 第三方中间件配置
CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'authorization',
    'content-type',
)

ROOT_URLCONF = 'luffyapi.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'luffyapi.wsgi.application'

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
import pymysql

pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffyapi',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'luffyapi',
        'PASSWORD': 'Luffy123?',
        'CHARSET': 'utf8',
    }
}

# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'zh-hans'
# LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/shanghai'
# TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

# USE_TZ = True
USE_TZ = False

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'
AUTH_USER_MODEL = 'user.User'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# # 1、定义三种日志输出格式，日志中可能用到的格式化串如下
# """
# %(name)s             Logger的名字, 没有指定默认就是root
# %(levelno)s          数字形式的日志级别(10, 20, 30, 40, 50)
# %(levelname)s        文本形式的日志级别(debug调试, info信息, warning警告, error错误, critical危险)
# %(pathname)s         调用日志输出函数的模块的完整路径名，可能没有
# %(filename)s         调用日志输出函数的模块的文件名
# %(module)s           调用日志输出函数的模块名
# %(funcName)s         调用日志输出函数的函数名
# %(lineno)d           调用日志输出函数的语句所在的代码行
# %(created)f          当前时间，用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d  输出日志信息时的，自Logger创建以 来的毫秒数
# %(asctime)s          字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
# %(thread)d           线程ID。可能没有
# %(threadName)s       线程名。可能没有
# %(process)d          进程ID。可能没有
# %(message)s          用户输出的消息
# """
#
# # 2. 定义日志的输出格式: 强调!! 其中的%(name)s为调用logging模块后, 使用logging.getlogger()时指定的日志名
# standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
#                   '[%(levelname)s][%(message)s]'
#
# simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
#
# test_format = '%(asctime)s] %(message)s'
#
# # 3、日志配置字典
# LOGGING = {
#     # version 指定的是你的版本信息。
#     'version': 1,
#
#     # disable_existing_loggers 关闭已存在日志。默认False
#     'disable_existing_loggers': False,
#
#     # formatters 加s代表可以设置很多个不同的日志格式。(注意: 这个不能改，这个是固定的。)
#     'formatters': {
#
#         # standard, simple, test 主要目的是通过自定义这些名字让"handlers"中拿到下面自定义的日志格式的表现形式(提示: 自定义的日志格式命名可以修改)。
#         'standard': {
#             # format (注意: 这个不能改，这是固定的格式。)  # standard_format 这里可以指定你自定义的日志格式表现的形式。这里是一个变量, 代指的就是步骤2中定义的日志的输出格式.
#             'format': standard_format
#         },
#         'simple': {
#             'format': simple_format
#         },
#         'test': {
#             'format': test_format
#         },
#     },
#     'filters': {},
#
#     # handlers 它是日志的接收者, 它用于控制日志的输出位置。不同的handler可以将日志输出到不同的位置.
#     'handlers': {
#         # console, default, other 这是你自定义的handler名(注意: 这里可以修改, 是你自定义的名字)
#
#         # 输出位置: 打印到终端的日志, 由下面的class对应的logging.StreamHandler控制
#         'console': {
#             'level': 'DEBUG',
#             'class': 'logging.StreamHandler',  # class 指定日志输出的形式。(注意不能改。)打印到屏幕
#             'formatter': 'simple'  # formatter 指定日志格式输出的形式, 会跑到上面formatters找到你之前所定义的格式simple。
#         },
#
#         # 输出位置: 打印到文件的日志, 由下面的class对应的logging.handlers.RotatingFileHandler控制
#         'default': {
#             'level': 'DEBUG',
#             'class': 'logging.handlers.RotatingFileHandler',
#             # RotatingFileHandler 指定日志轮转, 由下面的maxBytes与backupCount互相组合使用, 防止日志文件内容过大, 读取困难(补充: 内部的底层原理就是当达到了轮转的要求, 就会把你指定的文件"a1.log"重命名, 再新建一个"a1.log"文件, 存放最新的日志内容.)。 # 日志轮转,的重要的意义在于当你的日志文件存储数据过大取的情况。不应该让你的日志在日志文件里不断的累加。如果你的日志文件过大几的话，你打开文件的话就会非常的慢。所以我们需要定期的分割。
#
#             'formatter': 'standard',
#             'filename': os.path.join(os.path.dirname(BASE_DIR), 'logs', 'luffy.log'),
#             # maxBytes 最大轮转值, 当达到了这个值, 日志文件就会轮转.默认单位是字节Bytes。这里计算出来是: 5M
#             'maxBytes': 1024 * 1024 * 300,
#             'backupCount': 10,  # backupCount 指的是最多给你保存几份, 当达到了保存限制, 会删除你最老的日志文件。
#             'encoding': 'utf-8',  # 指定日志文件写入硬盘的编码.
#         },
#     },
#
#     # loggers 它是日志的产生者, 负责产生不同级别的日志, 产生的日志会传递给上面的handlers中, 让handlers中的每个自定义的"handler"控制输出的位置。
#     'loggers': {
#         # logger
#         # "logger"  指定''这种形式, 在执行logging.getLogger(key)时会判断,如果指定的key在下面的这些"logger"中都没找到, 就会把自定义key交给''中的"logger"处理, 处理以后, 交给上面的handlers进行处理
#         '': {
#             'handlers': ['console', 'default'],
#             # handlers 这里指定你要交给的Handler路径, 交给"default"和"console"上面我们"handlers"中自定义的"handler"处理.
#             'level': 'DEBUG',
#             # 这里又设置了日志级别，而handler中又设置了日志级别，这里有两层关卡。当使用logger_obj.info()这样的功能输入内容的时候. 会进行判断。如果日志级别满足，那么就会被收取到。满足以后会交给handlers中你自定义的"handler"来进行第二次筛选, 如果又满足，那么就会被你相应的"handler"功能, 进行处理。loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
#             'propagate': False,  # 默认为True，向上（更高level的logger）传递，通常设置为False即可，否则会将日志向上层层传递
#         },
#
#         # 这里为你专门的日志名进行提供服务, 在使用loggin.getlogger("日志名")时, 会跑到这里来匹配, 如果当时你指定的"日志名"与下面的key一致的时候就用使用下面的处理方式, 处理当前的日志. 当然没有匹配的情况下会跑到上面你什么都没指定''的里面去, 处理当前的日志, 以你指定的日志名作为你的日志名.
#         'django': {
#             'handlers': ['console', 'default'],
#             'level': 'INFO',
#             'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
#         },
#     },
# }
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            # 实际开发建议使用WARNING
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            # 实际开发建议使用ERROR
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建，注：这里的文件路径要注意BASE_DIR代表的是小luffyapi
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs", "luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            # 文件内容编码
            'encoding': 'utf-8'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,  # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exception.common_exception_handler',
}

